/* vim: set sw=8 ts=8 sts=8 expandtab: */
#ifndef CMAID_H
#define CMAID_H

/**
 * @mainpage Cmaid - manipulable and iteratable data types for C
 * @section intro_sec Introduction
 *
 * @b Cmaid is a collection of different container data types. The interface
 * and the actual implementation are sparated by using vtables. This makes
 * it possible, for example, dead-simple to exchange one @em map implementation
 * with another, by simply changing the contstructor.  The rest of your code can
 * stay as it was before.
 *
 * @section iter_sec The Iterators
 * Unlike in other @em ADT implementations, Cmaid's @ref Cmaid_Container
 * "containers" keep track of which @ref Cmaid_Iter "iterators" are
 * currently attached to them. This has the greate advantage that you can
 * iterator over a container, while you are manipulating it.
 *
 * @section class_sec The Classes
 * As mention before the collection interfaces are separated from their
 * implementation. Cmaid supports the following interfaces:
 *
 *     - The @ref Cmaid_List "List" class provides an sequentiall order
 *       collection as they are known from linked lists and vectors
 *     - The @ref Cmaid_Map "Map" class provides an associative array, to map
 *       a value to a key
 *     - The @ref Cmaid_Set "Set" class provides a set of unique and unordered
 *       values
 *     - The @ref Cmaid_Cache "Cache" class provides a pool to share memory for
 *       equal and constant objects.
 *
 * @section impl_sec The Implementations
 * There are different implemenations, some of them provide more then one
 * implementation of classes. Internally most of the 
 * implementation specific code is reused.
 * 
 * @b Cmaid provides the following implementations
 *     - The @ref Cmaid_Linked_List "Linked List" implementing the
 *       @ref Cmaid_List "list" class
 *     - The @ref Cmaid_Hash "Hash" implementing the @ref Cmaid_Map "map",
 *       @ref Cmaid_Set "set" and the @ref Cmaid_Cache "cache" classes
 *     - The @ref Cmaid_Tree "Tree" implementing the @ref Cmaid_Map "map"
 *       and the @ref Cmaid_Set "set" classes
 *     - The @ref Cmaid_Vector "Vector" implementing the
 *       @ref Cmaid_List "list" class
 *
 * @dot
 *      digraph Implementations {
 *              node [shape=box,fontname="Sans"];
 *              link_list -> list;
 *              vector -> list;
 *              tree -> map;
 *              tree -> set;
 *              hash -> set;
 *              hash -> map;
 *              hash -> cache;
 *              subgraph cluster_0{
 *                    color=white;
 *                    label="Implementations";
 *                    link_list [label="Linked List",
 *                              URL="\ref Cmaid_Linked_List"];
 *                    tree [label="Red-Black Tree",URL="\ref Cmaid_Tree"];
 *                    hash [label="Hash Table",URL="\ref Cmaid_Hash"];
 *                    vector [label="Vector",
 *                              URL="\ref Cmaid_Vector"];
 *              }
 *              subgraph cluster_1 {
 *                    color=white;
 *                    label="Interfaces";
 *                    labelloc="b";
 *                    map [label="Map",URL="\ref Cmaid_Map"];
 *                    set [label="Set",URL="\ref Cmaid_Set"];
 *                    cache [label="Cache",URL="\ref Cmaid_Cache"];
 *                    list [label="List",URL="\ref Cmaid_List"];
 *              }
 *      }
 * @enddot
 *
 * @section authors_sec The Authors
 *
 * @b Cmaid is written by:
 * @verbinclude AUTHORS
 *
 * @section license_sec The License
 *
 * @b Cmaid is under a BSD-like license with advertising clause, also know as
 * 3-clause BSD-license. Read here the full @link Cmaid_License license text
 * @endlink here. There is also a plain English @link Cmaid_License_Plain
 * copyright notice @endlink.
 */
/**
 * @page Cmaid_License The license of Cmaid
 * @verbinclude COPYING
 */
/**
 * @page Cmaid_License_Plain The plain English Copyright Notice
 * @verbinclude COPYING-PLAIN
 */
/**
 * @defgroup Classes The Classes
 */
/**
 * @defgroup Implementations The Implementations
 */
/**
 * @defgroup Misc Miscellaneous
 */
#ifdef EAPI
#undef EAPI
#endif
#ifdef _MSC_VER
#ifdef BUILDING_DLL
#define EAPI __declspec(dllexport)
#else
#define EAPI __declspec(dllimport)
#endif
#else
#ifdef __GNUC__
#if __GNUC__ >= 4
#define EAPI __attribute__ ((visibility("default")))
#else
#define EAPI
#endif
#else
#define EAPI
#endif
#endif

/**
 * @def CMAID_INLINE
 * Alias for @c static @c inline
 */
#define CMAID_INLINE static inline

#ifdef __cplusplus
extern "C" {
#endif

/*
 * The Value Interface
 */
#include <cmaid_value.h>
/*
 * The Iterator
 */
#include <cmaid_iter.h>
/*
 * The Interfaces
 */
#include <cmaid_magic.h>
#include <cmaid_container.h>
#include <cmaid_list.h>
#include <cmaid_set.h>
#include <cmaid_map.h>
#include <cmaid_cache.h>
/*
 * The Implementations
 */
#include <cmaid_hash.h>
#include <cmaid_linked_list.h>
#include <cmaid_tree.h>
#include <cmaid_skip_list.h>
#include <cmaid_vector.h>
/*
 * Utils
 */
#include <cmaid_stringcache.h>

#ifdef __cplusplus
}
#endif

#endif /* CMAID_H */
